#ifndef __BASIC_SOCK_H__
#define __BASIC_SOCK_H__

#include <basic/list.h>
#include <basic/sig.h>
#include <basic/netcm.h>

__BEGIN_DECLS

enum { WRAP=1 };

#define	SOCK_MSG_SIZE		KB(1024)	    /* 套接字消息大小 */

/*
 * 服务端监听
 */
extern SOCKET	/* INVALID_SOCK:失败 其它:可用的套接字 */
sock_listen(
        int server_port			/* [IN] 服务器端口 */
        );

/*
 * 客户端连接
 */
extern SOCKET	/* INVALID_SOCK:失败 >=0:可用的套接字
                   RET_ERR_TIMEOUT:超时 */
sock_connect(
        char *server_ip,		/* [IN] 服务器IP */
        int server_port,		/* [IN] 服务器端口 */
        int timeout				/* [IN] 超时(秒) 负值:阻塞 */
        );

/*
 * 服务端接受连接
 */
extern SOCKET	/* INVALID_SOCK:失败 其它:可用的套接字
                   RET_ERR_TIMEOUT:超时 */
sock_accept(
        SOCKET listen_sock,		/* [IN] 服务器监听套接字 */
        int timeout				/* [IN] 超时(秒) 负值:阻塞 */
        );

/*
 * 关闭套接字
 */
extern void
sock_close(
        SOCKET sock				/* [IN] 关闭套接字 */
        );

/*
 * 读套接字 
 */
extern int	/* 0: 成功，同时msg_size指示读取的消息大小
               -1: 消息头部无法读取或消息头部指示消息大小无效
               -2: recv错误 -3: 等待出错
               RET_ERR_TIMEOUT: 超时 RET_ERR_ABORT: 中断 */
sock_read(
        SOCKET sock,		/* [IN] 读套接字 */
        unsigned char *msg, /* [OUT] 读消息缓冲区 */
        int *msg_size,		/* [OUT] 读消息大小 */
        int timeout,		/* [IN] 超时(秒) 负值:阻塞 */
        unsigned int flag   /* [IN] 标志，WRAP | ... */
        );

/*
 * 写套接字 
 */
extern int	/* 0:成功，同时msg_size指示读取的消息大小
				-1: 消息头部无法读取或消息头部指示消息大小无效
				-2: send错误 -3: 等待出错
                RET_ERR_TIMEOUT: 超时 */
sock_write(
        SOCKET sock,		/* [IN] 写套接字 */
        unsigned char *msg,	/* [IN] 写消息缓冲区 */
        int *msg_size,		/* [IN,OUT] 写消息大小 */
        int timeout,		/* [IN] 超时(秒) 负值:无限等待 */
        unsigned int flag   /* [IN] 标志，WRAP | ... */
        );

/*
 * UNIX域监听
 */
extern SOCKET	/* INVALID_SOCK:失败 其它:可用的套接字 */
sock_local_listen(
        char *sun_path				/* [IN] UNIX域路径 */
        );

/*
 * 连接UNIX域
 */
extern SOCKET	/* INVALID_SOCK:失败 其它:可用的套接字 */
sock_local_connect(
        char *sun_path				/* [IN] UNIX域路径 */
        );

/*
 * 生成UNIX域套接字对
 */
extern int	/* 0:成功，同时sockpair返回有效套接字对 errno:失败 */
sock_local_pair(
        SOCKET sockpair[2]			/* [OUT] UNIX域套接字对 */
        );

__END_DECLS

#endif
